import numpy as np
from Constantes import PATH_ESPECTROS,qt
from Utils import buscaFreq

#Classe responsavel pelos espectros guardados que podem ser usados como
#referencia
class EspectroBanco:
    def __init__(self,espectro=None,freq=None,nome=None,framerate=None):
        self.gerente = Gerenciador()
        if (espectro is None) and (freq is None) and (framerate is None) and not (nome is None):
            self.carregar(nome)
        elif not (espectro is None) and not (freq is None) and not (nome is None) and not (framerate is None):
            self.espectro = self.__calcular_espectro(espectro,freq,nome,framerate)
    #armazena um novo espectro na memoria secundaria
    def armazenar(self,nome):
        self.gerente.salvar(nome,self.espectro)
    # carrega um espectro armazenado na memoria secunradia
    def carregar(self,valor):
        self.espectro = self.gerente.encontrar(valor)
    #retorna um espectro
    def obter_espectro(self):
        return self.espectro
    #Calcula o espectro conforme o modelo de referencia, que so mantem os
    #harmonicos
    def __calcular_espectro(self,spec,freq,nm,framerate,erro=qt):
        freq_fft = np.fft.fftfreq(len(spec))
        if len(freq_fft)%2==0:
            freq_fft=freq_fft[:len(freq_fft)/2]
            spec=spec[:len(spec)/2]
        else:
            freq_fft=freq_fft[:len(freq_fft)/2+1]
            spec=spec[:len(spec)/2+1]
        freq_fft=[abs(i*framerate) for i in freq_fft]
        harmonicos=[]
        i=freq
        n=1
        ultima_freq = freq_fft[len(freq_fft)-1]
        while i<ultima_freq:
            pos = buscaFreq(freq_fft,i,erro)
            if pos != -1:
                harmonicos.append(abs(spec[pos]))
            i=i*n
            n+=1
        return harmonicos
            
#gerencia a comunicacao com o disco
class Gerenciador:
    #encontra o arquivo no disco e o le
    def encontrar(self,nome):
        f = open(PATH_ESPECTROS+valor,'r')
        l = f.readline()
        l = np.array(eval(l))
        return l
    # salva o arquivo no disco
    def salvar(self,nome,espectro):
        f = open(PATH_ESPECTROS+nome,'w')
        f.write(str(list(espectro)))
        f.close()
